﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Recursos.Model
{
    public class RservacionModel
    {
        public bool CrearReservacion(string horainicio, string horafinal, string espacios, int idgrupo, DateTime fecha1, string dias, int periodo, int modalidad, int año,int idprofesor,int cedulausuario)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var periodos1 = new PeriodoModel();
           
            try
            {
              var period = periodos1.ComprobarPeriodo(int.Parse(año.ToString()), periodo, modalidad);
            }
            catch (Exception)
            {
                return false;

            }
           
            var espacio = new Repository<Espacio>(datacontext);       
            var carreraespacio = espacio.SearchOne(s => s.Codigo == espacios).Carrera.Nombre;
            var usuarios = new Repository<Usuario>(datacontext);
            var rolesusuarios = new Repository<RolXUsuario>(datacontext);
            var rolusuario=rolesusuarios.SearchOne(s=>s.Usuario.Cedula==cedulausuario);
            var usuario = usuarios.SearchOne(s => s.Cedula == cedulausuario);
            if (carreraespacio != usuario.Carrera.Nombre && usuario.Carrera.Nombre != "IC" && rolusuario.Rol.Descripcion == "Coordinador")
                return false; //si el espacio no es del mismo tipo del usuario y si el usuario es coordinador y no de IC no puede continuar
            var p= periodos1.RetornarPeriodo(int.Parse(año.ToString()), periodo, modalidad);
            var period1 = periodos1.CargarPorId(p);
            if (period1.FechaFinal < System.DateTime.Now.Date)
                return false;
            if (verificarDisponibilidad(espacios, dias, horainicio, horafinal,period1.id) == true )
            {
                var reservaciones = new Repository<Reservacion>(datacontext);
                var reservacionescurso = new Repository<ReservacionCurso>(datacontext);
                var periodos = new Repository<Periodo>(datacontext);
                //var espacio = new Repository<Espacio>(datacontext);
                var periodoseleccionado = periodos.SearchOne(per => per.NumeroPeriodo == periodo && per.Año == año && per.TipoPeriodo.id == modalidad);
                var espacioseleccionado = espacio.SearchOne(s => s.Codigo == espacios);
                int bloques = obtenerBloques(horainicio, horafinal);
                var reservacion = new Reservacion {CantidadDias=dias.Split('-').Length, HoraInicio = horainicio, HoraFinal = horafinal, Cupo = espacioseleccionado.Capacidad, fecha = fecha1, FechaInicio = periodoseleccionado.FechaInicio, FechaFinal = periodoseleccionado.FechaFinal, IdEspacio = espacioseleccionado.id, Borrado = false, Dias = dias, Bloques = bloques,IdPeriodo=periodoseleccionado.id };
                int idreservacion1 = reservaciones.Insert(reservacion);
                datacontext.SubmitChanges();
                var reservacioncurso = new ReservacionCurso { IdGrupo = idgrupo, IdReservacion = reservacion.id, Borrado = false };
                reservaciones.Insert(reservacion);
                reservacionescurso.Insert(reservacioncurso);
                var grupo = new Repository<Grupo>(datacontext);
                var gruposeleccionado = grupo.GetById(idgrupo);
                gruposeleccionado.IdProfesor = idprofesor;
                datacontext.SubmitChanges();
                return true;
            }
            else
                return false;

        }
        public bool CrearReservacionParticular(string horainicio, string horafinal, string espacios, DateTime fecha1, string dias, int modalidad, DateTime fechainicio,DateTime fechafinal, string institucionresponsable, string nombreresponsable, string usuarioresponsable, string descripcion,int año, int tipo,int cedulausuario)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var periodos1 = new PeriodoModel();

            try
            {
                var period = periodos1.ComprobarPeriodo(int.Parse(año.ToString()), tipo, modalidad);
            }
            catch (Exception)
            {
                return false;

            }
            var espacio = new Repository<Espacio>(datacontext);
            var carreraespacio = espacio.SearchOne(s => s.Codigo == espacios).Carrera.Nombre;
            var usuarios = new Repository<Usuario>(datacontext);
            var rolesusuarios = new Repository<RolXUsuario>(datacontext);
            var rolusuario = rolesusuarios.SearchOne(s => s.Usuario.Cedula == cedulausuario);
            var usuario = usuarios.SearchOne(s => s.Cedula == cedulausuario);
            if (carreraespacio != usuario.Carrera.Nombre && usuario.Carrera.Nombre != "IC" && rolusuario.Rol.Descripcion == "Coordinador")
                return false; //si el espacio no es del mismo tipo del usuario y si el usuario es coordinador y no de IC no puede continuar
            var periodos = new Repository<Periodo>(datacontext);
            var periodoseleccionado = periodos.SearchOne(per => per.NumeroPeriodo == tipo && per.Año == año && per.TipoPeriodo.id == modalidad);
            if (periodoseleccionado.FechaFinal < System.DateTime.Now.Date)
                return false;
            if (verificarDisponibilidadParticular(espacios, dias, horainicio, horafinal,fechainicio,fechafinal,periodoseleccionado.id) == true )
            {           
            var reservaciones = new Repository<Reservacion>(datacontext);
            var reservacionescurso = new Repository<ReservacionParticular>(datacontext);
            if (fechainicio < periodoseleccionado.FechaInicio || fechafinal > periodoseleccionado.FechaFinal)
                return false;           
            var espacioseleccionado = espacio.SearchOne(s => s.Codigo == espacios);
            int bloques = obtenerBloques(horainicio, horafinal);
            var reservacion = new Reservacion { CantidadDias = dias.Split('-').Length,IdPeriodo = periodoseleccionado.id, HoraInicio = horainicio, HoraFinal = horafinal, Cupo = espacioseleccionado.Capacidad, fecha = fecha1, FechaInicio = fechainicio, FechaFinal = fechafinal, IdEspacio = espacioseleccionado.id, Borrado = false, Dias = dias, Bloques = bloques };
            int idreservacion1 = reservaciones.Insert(reservacion);
            datacontext.SubmitChanges();
            var reservacioncurso = new ReservacionParticular {  IdReservacion=reservacion.id, InstitucionResponsable=institucionresponsable,NombreResponsable=nombreresponsable,UsuarioResponsable=usuarioresponsable,Descripcion=descripcion,Borrado=false};
            reservaciones.Insert(reservacion);
            reservacionescurso.Insert(reservacioncurso);
            datacontext.SubmitChanges();
            return true;
            }
            else
                return false;
        }

        public int obtenerBloques(string horaInicio, string horaFinal)
        {
            string[] inicio = horaInicio.Split(':');
            string[] final = horaFinal.Split(':');
            var difHoras = Int32.Parse(final[0]) - Int32.Parse(inicio[0]);
            var difMinutos = Int32.Parse(final[1]) - Int32.Parse(inicio[1]);
            int ajuste = 0;
            if (difHoras==0)
                ajuste = 1;
            return difHoras + ajuste;
                
        }

        public IEnumerable<ReservacionCurso> CargarReservaciones(int idperiodo)
        {
                var datacontext = new DataClassesRecursosDataContext();
                var reservacion = new Repository<ReservacionCurso>(datacontext);
                return reservacion.GetAll().Where(s => s.Borrado == false && s.Reservacion.IdPeriodo==idperiodo).ToList();           
        }

        public IEnumerable<ReservacionParticular> CargarReservacionesParticulares(int idperiodo)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var reservacion = new Repository<ReservacionParticular>(datacontext);
            return reservacion.GetAll().ToList().Where(s => s.Borrado == false && s.Reservacion.IdPeriodo==idperiodo);
        }

        public IEnumerable<ReservacionCurso> CargarReservacionesEspacio(int idespacio)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var reservacion = new Repository<ReservacionCurso>(datacontext);
            return reservacion.SearchFor(s => s.Reservacion.Espacio.id == idespacio && s.Borrado == false );
        }

        public IEnumerable<ReservacionCurso> CargarReservacionesEspacioAnno(int idespacio, int anno)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var reservacion = new Repository<ReservacionCurso>(datacontext);
            return reservacion.SearchFor(s => s.Reservacion.Espacio.id == idespacio && ((DateTime)s.Reservacion.FechaInicio).Year <= anno && anno <= ((DateTime)s.Reservacion.FechaFinal).Year && s.Borrado == false);
        }

        public IEnumerable<ReservacionCurso> CargarReservacionesEspacioNuevo(int idespacio,DateTime fechainicio, DateTime fechafinal)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var reservacion = new Repository<ReservacionCurso>(datacontext);
            return reservacion.SearchFor(s => s.Reservacion.Espacio.id == idespacio && s.Borrado == false 
   &&(((s.Reservacion.FechaInicio<=fechainicio  && fechainicio<=s.Reservacion.FechaFinal) || (s.Reservacion.FechaInicio<=fechafinal &&fechafinal<=s.Reservacion.FechaFinal))
  || ((fechainicio <= s.Reservacion.FechaInicio && s.Reservacion.FechaInicio <= fechafinal) || (fechainicio <= s.Reservacion.FechaFinal && s.Reservacion.FechaFinal <= fechafinal))
   ) );
        }
        
        public IEnumerable<ReservacionCurso> CargarReservacionesEspacio2(int idespacio,int idperiodo)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var reservacion = new Repository<ReservacionCurso>(datacontext);
            var periodomodel=new PeriodoModel();
            var fechainicio=periodomodel.CargarPorId(idperiodo).FechaInicio;
            var fechafinal = periodomodel.CargarPorId(idperiodo).FechaFinal;

            return reservacion.SearchFor(s => s.Reservacion.Espacio.id == idespacio && s.Borrado == false && (((s.Reservacion.FechaInicio <= fechainicio && fechainicio <= s.Reservacion.FechaFinal) || (s.Reservacion.FechaInicio <= fechafinal && fechafinal <= s.Reservacion.FechaFinal))
  || ((fechainicio <= s.Reservacion.FechaInicio && s.Reservacion.FechaInicio <= fechafinal) || (fechainicio <= s.Reservacion.FechaFinal && s.Reservacion.FechaFinal <= fechafinal))
   ) );
           
        }

        public IEnumerable<Reservacion> CargarReservacionesNormalesEspacio(int idespacio)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var reservacion = new Repository<Reservacion>(datacontext);
            return reservacion.SearchFor(s => s.Espacio.id == idespacio && s.Borrado == false);
        }

        public IEnumerable<ReservacionParticular> CargarReservacionesParticualresEspacioNuevo(int idespacio,DateTime fechainicio,DateTime fechafinal)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var reservacion = new Repository<ReservacionParticular>(datacontext);
            return reservacion.SearchFor(s => s.Reservacion.Espacio.id == idespacio && s.Borrado == false  &&(((s.Reservacion.FechaInicio<=fechainicio  && fechainicio<=s.Reservacion.FechaFinal) || (s.Reservacion.FechaInicio<=fechafinal &&fechafinal<=s.Reservacion.FechaFinal))
   || ((fechainicio <= s.Reservacion.FechaInicio && s.Reservacion.FechaInicio <= fechafinal) || (fechainicio <= s.Reservacion.FechaFinal && s.Reservacion.FechaFinal <= fechafinal))
   )
   
   
   
   );     }
       
        public IEnumerable<ReservacionParticular> CargarReservacionesParticualresEspacio(int idespacio)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var reservacion = new Repository<ReservacionParticular>(datacontext);
            return reservacion.SearchFor(s => s.Reservacion.Espacio.id == idespacio &&  s.Borrado == false);
        }

        public IEnumerable<ReservacionParticular> CargarReservacionesParticualresEspacioAnno(int idespacio, int anno)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var reservacion = new Repository<ReservacionParticular>(datacontext);
            return reservacion.SearchFor(s => s.Reservacion.Espacio.id == idespacio && ((DateTime)s.Reservacion.FechaInicio).Year <= anno && anno <= ((DateTime)s.Reservacion.FechaFinal).Year && s.Borrado == false);
        }

        public IEnumerable<ReservacionParticular> CargarReservacionesParticualresEspacio2(int idespacio,int idperiodo)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var reservacion = new Repository<ReservacionParticular>(datacontext);
            var periodomodel= new PeriodoModel();
            var fechainicio=periodomodel.CargarPorId(idperiodo).FechaInicio;
            var fechafinal=periodomodel.CargarPorId(idperiodo).FechaFinal;
            return reservacion.SearchFor(s => s.Reservacion.Espacio.id == idespacio && s.Borrado == false  &&(((s.Reservacion.FechaInicio<=fechainicio  && fechainicio<=s.Reservacion.FechaFinal) || (s.Reservacion.FechaInicio<=fechafinal &&fechafinal<=s.Reservacion.FechaFinal))
  || ((fechainicio <= s.Reservacion.FechaInicio && s.Reservacion.FechaInicio <= fechafinal) || (fechainicio <= s.Reservacion.FechaFinal && s.Reservacion.FechaFinal <= fechafinal))
   ) );      }

        public bool ActualizarReservacion(string horainicio, string horafinal, string espacios, int idgrupo, string dias, int idprofesor,int id,int idperiodo,int cedula)
        {
                var datacontext = new DataClassesRecursosDataContext();
                var reservaciones = new Repository<ReservacionCurso>(datacontext);
                var reservacion = reservaciones.GetById(id);
            if (verificarDisponibilidadActualizar(espacios, dias, horainicio, horafinal,reservacion.Reservacion.id,reservacion.Reservacion.FechaInicio.ToString(),reservacion.Reservacion.FechaInicio.ToString(),idperiodo) == true)
            {
                
                reservacion.IdGrupo = idgrupo;
                reservacion.Grupo.IdProfesor = idprofesor;
                var reservacionesprincipal = new Repository<Reservacion>(datacontext);
                var reservacionprincipal = reservacionesprincipal.GetById(reservacion.Reservacion.id);
                reservacionprincipal.Bloques = obtenerBloques(horainicio, horafinal);
                reservacionprincipal.Dias = dias;
                reservacionprincipal.HoraInicio = horainicio;
                reservacionprincipal.HoraFinal = horafinal;

                var usuarios = new Repository<Usuario>(datacontext);
                var roles = new Repository<RolXUsuario>(datacontext);
                var rol = roles.SearchOne(s => s.Usuario.Cedula == cedula);
                var usuario = usuarios.SearchOne(s=>s.Cedula==cedula);

                var espacio = new Repository<Espacio>(datacontext);
                var espacioseleccionado = espacio.SearchOne(s => s.Codigo == espacios);
                if (espacioseleccionado.Carrera.Nombre != usuario.Carrera.Nombre && usuario.Carrera.Nombre != "IC" && rol.Rol.Descripcion == "Coordinador")
                    return false;


                reservacionprincipal.IdEspacio = espacioseleccionado.id;
                reservacionprincipal.Cupo = espacioseleccionado.Capacidad;
                datacontext.SubmitChanges();
                return true;
            }
            else
                return false;
        }

        public int EliminarReservacion(int id,int cedula)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var reservacionescurso = new Repository<ReservacionCurso>(datacontext);
            var reservacionesgeneral = new Repository<Reservacion>(datacontext);
            var reservacion = reservacionescurso.GetById(id);
            var reservaciongeneral = reservacionesgeneral.SearchFor(s => reservacion.IdReservacion == s.id).First();
            var usuarios = new Repository<Usuario>(datacontext);
            var roles = new Repository<RolXUsuario>(datacontext);
            var rol = roles.SearchOne(s => s.Usuario.Cedula == cedula);
            var usuario = usuarios.SearchOne(s => s.Cedula == cedula);
            if (reservaciongeneral.Espacio.Carrera.Nombre != usuario.Carrera.Nombre && usuario.Carrera.Nombre != "IC" && rol.Rol.Descripcion == "Coordinador")
                return 0;
            reservacion.Borrado = true;
            reservaciongeneral.Borrado = true;
            datacontext.SubmitChanges();
            return 1;
        }


        public int EliminarReservacionParticular(int id,int cedula)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var reservacionescurso = new Repository<ReservacionParticular>(datacontext);
            var reservacionesgeneral = new Repository<Reservacion>(datacontext);
            var reservacion = reservacionescurso.GetById(id);
            var reservaciongeneral = reservacionesgeneral.SearchFor(s => reservacion.IdReservacion== s.id).First();
            var usuarios = new Repository<Usuario>(datacontext);
            var roles = new Repository<RolXUsuario>(datacontext);
            var rol = roles.SearchOne(s => s.Usuario.Cedula == cedula);
            var usuario = usuarios.SearchOne(s => s.Cedula == cedula);
            if (reservaciongeneral.Espacio.Carrera.Nombre != usuario.Carrera.Nombre && usuario.Carrera.Nombre != "IC" && rol.Rol.Descripcion == "Coordinador")
                return 0;
            reservacion.Borrado = true;
            reservaciongeneral.Borrado = true;
            datacontext.SubmitChanges();
            return 1;

        }

        public bool ActualizarReservacionParticular(int id, string institucionresponsable, string nombreresponsable, string descripcion,string usuario,string horainicio,string horafinal,string dias,string espacios,string fechainicio, string fechafinal,int idperiodo,int cedula)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var reservaciones = new Repository<ReservacionParticular>(datacontext);
            var reservacion = reservaciones.GetById(id);
            if (verificarDisponibilidadActualizar(espacios, dias, horainicio, horafinal, reservacion.Reservacion.id,fechainicio,fechafinal,idperiodo) == true)
            {
                var espacio = new Repository<Espacio>(datacontext);
                var espacioseleccionado = espacio.SearchOne(s => s.Codigo == espacios);
                var usuarios = new Repository<Usuario>(datacontext);
                var roles = new Repository<RolXUsuario>(datacontext);
                var rol = roles.SearchOne(s => s.Usuario.Cedula == cedula);
                var usuariocoor = usuarios.SearchOne(s => s.Cedula == cedula);
                if (DateTime.Parse(fechainicio) < DateTime.Parse(reservacion.Reservacion.Periodo.FechaInicio.ToString()) || DateTime.Parse(fechafinal) > DateTime.Parse(reservacion.Reservacion.Periodo.FechaFinal.ToString()) || DateTime.Parse(reservacion.Reservacion.Periodo.FechaFinal.ToString())<System.DateTime.Now.Date )
                    return false; 

                if (espacioseleccionado.Carrera.Nombre != usuariocoor.Carrera.Nombre && usuariocoor.Carrera.Nombre != "IC" && rol.Rol.Descripcion == "Coordinador")
                    return false;
                reservacion.InstitucionResponsable = institucionresponsable;
                reservacion.NombreResponsable = nombreresponsable;
                reservacion.UsuarioResponsable = usuario;
                reservacion.Descripcion = descripcion;
                var reservacionesprincipal = new Repository<Reservacion>(datacontext);
                var reservacionprincipal = reservacionesprincipal.GetById(reservacion.Reservacion.id);
                reservacionprincipal.Bloques = obtenerBloques(horainicio, horafinal);
                reservacionprincipal.Dias = dias;
                reservacionprincipal.HoraInicio = horainicio;
                reservacionprincipal.HoraFinal = horafinal;
                reservacionprincipal.IdEspacio = espacioseleccionado.id;
                reservacionprincipal.Cupo = espacioseleccionado.Capacidad;
                datacontext.SubmitChanges();
                return true;
            }
            else
                return false;

        }

  
         
        public bool verificarDisponibilidad(string espacios, string dias, string horainicio, string horafinal,int idperiodo)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var espacio = new Repository<Espacio>(datacontext);
            var espacioseleccionado = espacio.SearchOne(s => s.Codigo == espacios);
            bool disponible = true;
            var reservaciones = CargarReservacionesEspacio2(espacioseleccionado.id,idperiodo);
            var reservacionesespacio = CargarReservacionesParticualresEspacio2(espacioseleccionado.id,idperiodo);
            foreach (var reservacion in reservaciones)
            {   
               // if(reservacion.Reservacion.HoraInicio=)
                string[] hinicio = horainicio.Split(':');
                string[] hfinal = horafinal.Split(':');
                int intinicio = int.Parse(hinicio[0] + hinicio[1]);
                int intfinal = int.Parse(hfinal[0] + hfinal[1]);
                string[] hinicioreservacion = reservacion.Reservacion.HoraInicio.Split(':');
                string[] hfinalreservacion = reservacion.Reservacion.HoraFinal.Split(':');
                int intinicioreservacion = int.Parse(hinicioreservacion[0] + hinicioreservacion[1]);
                int intfinalreservacion = int.Parse(hfinalreservacion[0] + hfinalreservacion[1]);
                bool estadodias=veridicarDias(reservacion.Reservacion.Dias,dias);
                if (reservacion.Reservacion.IdEspacio == espacioseleccionado.id && estadodias == true && ((intinicioreservacion <= intinicio && intfinalreservacion <= intfinal && intfinalreservacion >= intinicio) || (intfinalreservacion >= intfinal && intinicioreservacion >= intinicio && intinicioreservacion <= intfinal) || (intinicio <= intinicioreservacion && intinicio<= intfinalreservacion && intfinal >= intinicioreservacion && intfinal>=intfinalreservacion)))
                    disponible = false;
            }

            foreach (var reservacion in reservacionesespacio)
            {
                string[] hinicio = horainicio.Split(':');
                string[] hfinal = horafinal.Split(':');
                int intinicio = int.Parse(hinicio[0] + hinicio[1]);
                int intfinal = int.Parse(hfinal[0] + hfinal[1]);
                string[] hinicioreservacion = reservacion.Reservacion.HoraInicio.Split(':');
                string[] hfinalreservacion = reservacion.Reservacion.HoraFinal.Split(':');
                int intinicioreservacion = int.Parse(hinicioreservacion[0] + hinicioreservacion[1]);
                int intfinalreservacion = int.Parse(hfinalreservacion[0] + hfinalreservacion[1]);
                bool estadodias = veridicarDias(reservacion.Reservacion.Dias, dias);
                if (reservacion.Reservacion.IdEspacio == espacioseleccionado.id && estadodias == true && ((intinicioreservacion <= intinicio && intfinalreservacion <= intfinal && intfinalreservacion >= intinicio) || (intfinalreservacion >= intfinal && intinicioreservacion >= intinicio && intinicioreservacion <= intfinal) || (intinicio <= intinicioreservacion && intinicio <= intfinalreservacion && intfinal >= intinicioreservacion && intfinal >= intfinalreservacion)))
                    disponible = false;
            }
            return disponible;
        }


        public bool verificarDisponibilidadParticular(string espacios, string dias, string horainicio, string horafinal, DateTime fechainicio, DateTime fechafinal,int idperiodo)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var espacio = new Repository<Espacio>(datacontext);
            var espacioseleccionado = espacio.SearchOne(s => s.Codigo == espacios);
            bool disponible = true;
            var reservaciones = CargarReservacionesEspacio2(espacioseleccionado.id,idperiodo);
            var reservacionesespacio = CargarReservacionesParticualresEspacio2(espacioseleccionado.id,idperiodo);
            foreach (var reservacion in reservaciones)
            {
                string[] hinicio = horainicio.Split(':');
                string[] hfinal = horafinal.Split(':');
                int intinicio = int.Parse(hinicio[0] + hinicio[1]);
                int intfinal = int.Parse(hfinal[0] + hfinal[1]);
                string[] hinicioreservacion = reservacion.Reservacion.HoraInicio.Split(':');
                string[] hfinalreservacion = reservacion.Reservacion.HoraFinal.Split(':');
                int intinicioreservacion = int.Parse(hinicioreservacion[0] + hinicioreservacion[1]);
                int intfinalreservacion = int.Parse(hfinalreservacion[0] + hfinalreservacion[1]);
                bool estadodias = veridicarDias(reservacion.Reservacion.Dias, dias);
                if (reservacion.Reservacion.IdEspacio == espacioseleccionado.id && estadodias == true && ((intinicioreservacion <= intinicio && intfinalreservacion <= intfinal && intfinalreservacion >= intinicio) || (intfinalreservacion >= intfinal && intinicioreservacion >= intinicio && intinicioreservacion <= intfinal) || (intinicio <= intinicioreservacion && intinicio <= intfinalreservacion && intfinal >= intinicioreservacion && intfinal >= intfinalreservacion)))
                    disponible = false;
            }

            foreach (var reservacion in reservacionesespacio)
            {
                string[] hinicio = horainicio.Split(':');
                string[] hfinal = horafinal.Split(':');
                int intinicio = int.Parse(hinicio[0] + hinicio[1]);
                int intfinal = int.Parse(hfinal[0] + hfinal[1]);
                string[] hinicioreservacion = reservacion.Reservacion.HoraInicio.Split(':');
                string[] hfinalreservacion = reservacion.Reservacion.HoraFinal.Split(':');
                int intinicioreservacion = int.Parse(hinicioreservacion[0] + hinicioreservacion[1]);
                int intfinalreservacion = int.Parse(hfinalreservacion[0] + hfinalreservacion[1]);
                bool estadodias = veridicarDiasParticular(reservacion.Reservacion.Dias, dias,fechainicio,fechafinal,DateTime.Parse(reservacion.Reservacion.FechaInicio.ToString()),DateTime.Parse(reservacion.Reservacion.FechaFinal.ToString()));
                if (reservacion.Reservacion.IdEspacio == espacioseleccionado.id && estadodias == true && ((intinicioreservacion <= intinicio && intfinalreservacion <= intfinal && intfinalreservacion >= intinicio) || (intfinalreservacion >= intfinal && intinicioreservacion >= intinicio && intinicioreservacion <= intfinal) || (intinicio <= intinicioreservacion && intinicio <= intfinalreservacion && intfinal >= intinicioreservacion && intfinal >= intfinalreservacion)))
                    disponible = false;
            }
            return disponible;
        }


        public bool verificarDisponibilidadActualizar(string espacios, string dias, string horainicio, string horafinal,int idreservacion,string fechainicio, string fechafinal,int idperiodo)
        {
            var datacontext = new DataClassesRecursosDataContext();
            var espacio = new Repository<Espacio>(datacontext);
            var espacioseleccionado = espacio.SearchOne(s => s.Codigo == espacios);
            bool disponible = true;
            var reservaciones = CargarReservacionesEspacio2(espacioseleccionado.id,idperiodo);
            var reservacionesespacio = CargarReservacionesParticualresEspacio2(espacioseleccionado.id,idperiodo);
            foreach (var reservacion in reservaciones)
            {
                string[] hinicio = horainicio.Split(':');
                string[] hfinal = horafinal.Split(':');
                int intinicio = int.Parse(hinicio[0] + hinicio[1]);
                int intfinal = int.Parse(hfinal[0] + hfinal[1]);
                string[] hinicioreservacion = reservacion.Reservacion.HoraInicio.Split(':');
                string[] hfinalreservacion = reservacion.Reservacion.HoraFinal.Split(':');
                int intinicioreservacion = int.Parse(hinicioreservacion[0] + hinicioreservacion[1]);
                int intfinalreservacion = int.Parse(hfinalreservacion[0] + hfinalreservacion[1]);
                bool estadodias = veridicarDias(reservacion.Reservacion.Dias, dias);
                if (reservacion.Reservacion.IdEspacio == espacioseleccionado.id && idreservacion!=reservacion.Reservacion.id&& estadodias == true && ((intinicioreservacion <= intinicio && intfinalreservacion <= intfinal && intfinalreservacion >= intinicio) || (intfinalreservacion >= intfinal && intinicioreservacion >= intinicio && intinicioreservacion <= intfinal) || (intinicio <= intinicioreservacion && intinicio <= intfinalreservacion && intfinal >= intinicioreservacion && intfinal >= intfinalreservacion)))
                    disponible = false;
            }

            foreach (var reservacion in reservacionesespacio)
            {
                string[] hinicio = horainicio.Split(':');
                string[] hfinal = horafinal.Split(':');
                int intinicio = int.Parse(hinicio[0] + hinicio[1]);
                int intfinal = int.Parse(hfinal[0] + hfinal[1]);
                string[] hinicioreservacion = reservacion.Reservacion.HoraInicio.Split(':');
                string[] hfinalreservacion = reservacion.Reservacion.HoraFinal.Split(':');
                int intinicioreservacion = int.Parse(hinicioreservacion[0] + hinicioreservacion[1]);
                int intfinalreservacion = int.Parse(hfinalreservacion[0] + hfinalreservacion[1]);
                bool estadodias = veridicarDiasParticular(reservacion.Reservacion.Dias, dias,DateTime.Parse(fechainicio),DateTime.Parse(fechafinal),DateTime.Parse(reservacion.Reservacion.FechaInicio.ToString()),DateTime.Parse(reservacion.Reservacion.FechaFinal.ToString()));
                if (reservacion.Reservacion.IdEspacio == espacioseleccionado.id &&idreservacion!=reservacion.Reservacion.id  && estadodias == true && ((intinicioreservacion <= intinicio && intfinalreservacion <= intfinal && intfinalreservacion >= intinicio) || (intfinalreservacion >= intfinal && intinicioreservacion >= intinicio && intinicioreservacion <= intfinal) || (intinicio <= intinicioreservacion && intinicio <= intfinalreservacion && intfinal >= intinicioreservacion && intfinal >= intfinalreservacion)))
                    disponible = false;
            }
            return disponible;
        }

        public bool veridicarDias(string diasreservacion, string diassolicitados)
        {
            string[] dreservacion = diasreservacion.Split('-');
            string[] dsolicitados = diassolicitados.Split('-');
            bool choque=false;
            for (int i = 0; i < dreservacion.Length; i++)
                for (int j = 0;j< dsolicitados.Length; j++)
                    if (dreservacion[i] == dsolicitados[j] && dreservacion[i] != "-" && dreservacion[i] != "")
                        choque = true;
            return choque;

        }
        public bool veridicarDiasParticular(string diasreservacion, string diassolicitados,DateTime fechainicio,DateTime fechafinal,DateTime fechainiciooriginal, DateTime fechafinaloriginal)
        {
            string[] dreservacion = diasreservacion.Split('-');
            string[] dsolicitados = diassolicitados.Split('-');
            bool choque = false;
          System.Globalization.CultureInfo norwCulture = System.Globalization.CultureInfo.CreateSpecificCulture("es");
          System.Globalization.Calendar cal = norwCulture.Calendar;
          int SemanaInicio = cal.GetWeekOfYear(fechainicio, norwCulture.DateTimeFormat.CalendarWeekRule, norwCulture.DateTimeFormat.FirstDayOfWeek);
          int SemanaFinal = cal.GetWeekOfYear(fechafinal, norwCulture.DateTimeFormat.CalendarWeekRule, norwCulture.DateTimeFormat.FirstDayOfWeek);
          int SemanaInicioBD = cal.GetWeekOfYear(fechainiciooriginal, norwCulture.DateTimeFormat.CalendarWeekRule, norwCulture.DateTimeFormat.FirstDayOfWeek);
          int SemanaFinalBD = cal.GetWeekOfYear(fechafinaloriginal, norwCulture.DateTimeFormat.CalendarWeekRule, norwCulture.DateTimeFormat.FirstDayOfWeek);
              
            for (int i = 0; i < dreservacion.Length; i++)
                for (int j = 0; j < dsolicitados.Length; j++)
                    if (dreservacion[i] == dsolicitados[j] && dreservacion[i] != "-" && dreservacion[i] != "" && ((SemanaFinalBD <= SemanaInicio && SemanaInicio <= SemanaFinalBD) || (SemanaInicioBD <= SemanaFinal && SemanaFinal <= SemanaFinalBD)))
                        choque = true;
            return choque;

        }

        public string ObtenerDetallesReservacion(int id, bool dia)
        {
            string separador;
            if (dia)
                separador = "\n";
            else
                separador = "\\n";

            string detalles = "";

            var datacontext = new DataClassesRecursosDataContext();
            var reservacionescurso = new Repository<ReservacionCurso>(datacontext);
            var cursos = new Repository<Curso>(datacontext);
            var grupos = new Repository<Grupo>(datacontext);
            var profes = new Repository<Usuario>(datacontext);

            ReservacionCurso reservacion = reservacionescurso.GetById(id);
            var curso = cursos.GetById(reservacion.Grupo.IdCurso);
            var profe = profes.GetById(reservacion.Grupo.IdProfesor);

            detalles +="Carrera: " +curso.Carrera.Nombre + separador;
            detalles +="Curso: " + curso.Codigo + " " + curso.Nombre + separador;
            detalles +="Periodo: " + reservacion.Reservacion.Periodo.TipoPeriodo.Nombre + " ";
            detalles += reservacion.Reservacion.Periodo.NumeroPeriodo + " de ";
            detalles += reservacion.Reservacion.Periodo.Año + separador;
            detalles +="Profesor: " + profe.Nombre + separador;
            detalles +="Horario: " + reservacion.Reservacion.Dias + " " + reservacion.Reservacion.HoraInicio + "-" + reservacion.Reservacion.HoraFinal;
            detalles += separador;
            return detalles;
        }

        public string ObtenerDetallesReservacionParticular(int id, bool dia)
        {
            string separador;
            if (dia)
                separador = "\n";
            else
                separador = "\\n";

            string detalles = "";
            var datacontext = new DataClassesRecursosDataContext();
            var reservacionesParticulares = new Repository<ReservacionParticular>(datacontext);
            var particular = reservacionesParticulares.GetById(id);
            detalles += "Responsable: "+ particular.NombreResponsable + separador;
            detalles += "Institución: "+particular.InstitucionResponsable + separador;
            detalles += "Descripción: "+particular.Descripcion + separador;
            var fecha = (DateTime)particular.Reservacion.FechaInicio;
            detalles += "Horario: "+fecha.ToShortDateString();
            if (particular.Reservacion.FechaInicio != particular.Reservacion.FechaFinal)
            {
                var fechaFin = (DateTime)particular.Reservacion.FechaFinal;
                detalles += "-" + fechaFin.ToShortDateString();
            }
             
            detalles += " "+particular.Reservacion.HoraInicio + "-" + particular.Reservacion.HoraFinal + separador;
            detalles += "Periodo: "+particular.Reservacion.Periodo.TipoPeriodo.Nombre + " ";
            detalles += particular.Reservacion.Periodo.NumeroPeriodo + " de ";
            detalles += particular.Reservacion.Periodo.Año + separador;
            return detalles;
        }
    }
}